iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
AI & Data

從Keras框架與數學概念了解機器學習系列 第 16

[從Keras框架與數學概念了解機器學習] - 16. 自定義 activation 與內建 activation

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230916/20144614bdF3cs0mq8.jpg

Layer指定使用哪種 activation 有下列方式 (這邊皆以 "relu" 來做範例) :

(1) 指定函式名稱 'relu' (內建 預設)

範例程式:

from tensorflow.keras.models import Sequential
from tensorflow.keras import layers 
from tensorflow.keras.models import Model

model = Sequential([
 layers.Dense(10, activation="relu")
 ])

依照範例程式之指定函式名稱'relu',會經過以下函式:
 keras.activations.get 
 -> keras.activations.deserialize 
 -> keras.saving.serialization_lib.deserialize_keras_object 
 -> keras.saving.serialization_lib.serialize_with_public_fn 
 -> keras.saving.serialization_lib._retrieve_class_or_fn

要注意的是,透過 keras.saving.serialization_lib.serialize_with_public_fn 將資訊包成 dict 字串,
 字串內容為
{'class_name': 'function', 'config': 'relu', 'module': 'keras.activations', 'registered_name': 'relu'}
 並傳入 keras.saving.serialization_lib._retrieve_class_or_fn 並指定 obj_type = 'function',接著回傳 activation 物件。

(2) 指定類別名稱 'ReLU' (內建 預設)

範例程式:

from tensorflow.keras.models import Sequential
from tensorflow.keras import layers 
from tensorflow.keras.models import Model

model = Sequential([
 layers.Dense(10, activation="ReLU")
 ])

注意大小寫名稱。
依照範例程式之指定函式名稱'ReLU',會經過以下函式:
 keras.activations.get 
 -> keras.activations.deserialize 
 -> keras.saving.serialization_lib.deserialize_keras_object 
 -> keras.saving.serialization_lib.serialize_with_public_class 
 -> keras.saving.serialization_lib._retrieve_class_or_fn 

這邊是透過 keras.saving.serialization_lib.serialize_with_public_class 將資訊包成 dict 字串,
字串內容為
{'class_name': 'ReLU', 'config': None, 'module': 'keras.layers', 'registered_name': None}
 並傳入 keras.saving.serialization_lib._retrieve_class_or_fn 並指定 obj_type = 'class',接著回傳 activation 物件。

其實 指定 'relu' 和 'ReLU' 是一樣的。 只是一種是直接使用函式轉換,另一種是利用實作類別的call function來使用。
而 (1)(2) 此二種都會經由一個 mapping 來找出對應的activation物件。其mapping的內容如下:

class:
 'ELU': keras.layers.activation.elu.ELU
 'LeakyReLU': keras.layers.activation.leaky_relu.LeakyReLU 
 'PReLU': keras.layers.activation.prelu.PReLU
 'ReLU': keras.layers.activation.relu.ReLU
 'Softmax': keras.layers.activation.softmax.Softmax
 'ThresholdedReLU': keras.layers.activation.thresholded_relu.ThresholdedReLU
 
function:
 'elu' : keras.activations.elu
 'linear' : keras.activations.linear
 'exponential' : keras.activations.exponential
 'gelu' : keras.activations.gelu
 'hard_sigmoid' : keras.activations.hard_sigmoid
 'leaky_relu' : keras.activations.leaky_relu
 'mish' : keras.activations.mish
 'relu' : keras.activations.relu
 'selu' : keras.activations.selu
 'sigmoid' : keras.activations.sigmoid
 'silu' : keras.activations.silu
 'softmax' : keras.activations.softmax
 'softplus' : keras.activations.softplus
 'softsign' : keras.activations.softsign
 'swish' : keras.activations.swish
 'tanh' : keras.activations.tanh

(3) 自定義類別

範例程式:

from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.models import Model

class MyReLU(layers.Layer):
    def __init__(self, max_value=None, negative_slope=0.0, threshold=0.0, **kwargs):
        super().__init__(**kwargs)
        self.DefinedFunction = layers.ReLU(max_value, negative_slope, threshold)
        
    def call(self, inputs):
        return self.DefinedFunction.call(inputs)

model = Sequential([
layers.Dense(10, activation= MyReLU(max_value=None, negative_slope=0.0, threshold=0.0) )
])

此範例展示自定義activation類別,必須繼承 keras.layers.Layer , 並實作 init 與 call 函式。 call函式會因為 父類別__call__的轉換而被呼叫。而此範例只是再利用內建的relu,目的為做簡單的自定義例子來展現必須實作之處。
所以如果要自定義activation類別,可以實作此call函式,將要轉換的公式至於此,並記得回傳透過公式轉換之結果。

(4) 直接使用內建類別

範例程式:

from tensorflow.keras.models import Sequential
from tensorflow.keras import layers 
from tensorflow.keras.models import Model

model = Sequential([
 layers.Dense(10, activation= layers.ReLU(max_value=None, negative_slope=0.0, threshold=0.0))
 ])

第四個範例直接使用內建類別,可以直接試試看,不再詳細敘述。

以上是幾種取得並設定activation的方式,紀錄於此。


上一篇
[從Keras框架與數學概念了解機器學習] - 15. optimizer 與 learning_rate
下一篇
[從Keras框架與數學概念了解機器學習] - 17. 自定義Callback與如何應用
系列文
從Keras框架與數學概念了解機器學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言